package com.ruanjian.api.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

@Slf4j
@Component
public class RedisUtil {

    @Resource
    private RedisTemplate<String,Object> redisTemplate;

    /**
     * 往redis中缓存数据
     * @param key 键值
     * @param value 数据
     * @param time 过期时间
     * @return
     */
    public boolean set(String key,Object value,Integer time){

        if (StringUtils.isBlank(key)) {
            return false;
        }
        try {
            redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
            log.info("存入redis成功: key：{}, value：{}", key, value);
            return true;
        } catch (Exception e) {
            log.error("存入redis失败: key：{}, value：{}", key, value);
            e.printStackTrace();
        }
        return false;

    }

    /**
     * 根据key从redis服务器中获取value值
     * @param key
     * @return
     */
    public Object get(String key){

        if (StringUtils.isBlank(key)) {
            return null;
        }
        try {
            return redisTemplate.opsForValue().get(key);
        } catch (Exception e) {
            log.error(key + "获取失败...");
            e.printStackTrace();
        }
        return null;

    }

    /**
     * 判断key是否存在
     * @param key 键值
     * @return true: 存在, false: 不存在
     */
    public Boolean exitKey(String key){
        ValueOperations<String,Object> vo=redisTemplate.opsForValue();
        return vo.getOperations().hasKey(key);
    }

    /**
     * 判断key是否过期
     * @param key 键值
     * @return true: 过期, false: 没过期
     */
    public Boolean isExpire(String key){
        ValueOperations<String,Object> vo=redisTemplate.opsForValue();
        return getExpireTime(key) > 1 ? false : true;
    }

    /**
     * 从redis中获取key对应的过期时间;
     *
     * @param key
     * @return 如果该值有过期时间，就返回相应的过期时间;
     *         如果该值没有设置过期时间，就返回-1;
     *         如果没有该值，就返回-2;
     */
    public long getExpireTime(String key) {
        ValueOperations<String,Object> vo=redisTemplate.opsForValue();
        return vo.getOperations().getExpire(key);
    }

}